package com.taotao.protal.service.impl;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.taotao.common.pojo.TaotaoResult;
import com.taotao.common.util.CookieUtils;
import com.taotao.common.util.HttpClientUtil;
import com.taotao.common.util.JsonUtils;
import com.taotao.pojo.TbItem;
import com.taotao.protal.pojo.CartItem;
import com.taotao.protal.service.CartService;

/**
 * 购物车service(门户网站)
 * @author fangys
 * @version 创建时间：2016年11月19日 上午11:39:03
 */
@Service
public class CartServiceImpl implements CartService{

	@Value("${REST_BASE_URL}")
	private String REST_BASE_URL;
	
	@Value("${ITME_INFO_URL}")
	private String ITME_INFO_URL;

	/**
	 * 添加购物车商品
	 * <p>Title: addCartItem</p>
	 * <p>Description: </p>
	 * @param itemId 商品id
	 * @param num 购买数量
	 * @return
	 * @see com.taotao.portal.service.CartService#addCartItem(long, int)
	 */
	@Override
	public TaotaoResult addCartItem(long itemId, int num, 
			HttpServletRequest request, HttpServletResponse response) {
		//取商品信息
		CartItem cartItem = null;
		//1.读取cookie获取购物车的商品
		List<CartItem> itemList = getCartItemList(request);
		//2.遍历购物车商品,如果与当前添加商品是同一种,就把数量+1
		for(CartItem item : itemList){
			//如果存在此商品
			if(item.getId() == itemId){
				item.setNum(item.getNum() + num);
				cartItem = item;
				break;
			}
		}
		
		
		//3.如果不是同一种,就到数据库中查询商品信息,添加到购物车
		if(cartItem == null){
			cartItem = new CartItem();
			String json = HttpClientUtil.doGet(REST_BASE_URL + ITME_INFO_URL + itemId);
			//把json转换成java对象
			TaotaoResult taotaoResult = TaotaoResult.formatToPojo(json, TbItem.class);
			if(taotaoResult.getStatus() == 200){
				TbItem item = (TbItem) taotaoResult.getData();
				cartItem.setId(item.getId());
				cartItem.setTitle(item.getTitle());
				cartItem.setImage(item.getImage() == null ? "":item.getImage().split(",")[0]);
				cartItem.setNum(num);
				cartItem.setPrice(item.getPrice());
			}
			//添加到购物车列表
			itemList.add(cartItem);
		}
		//4.把购物车写回cookie
		CookieUtils.setCookie(request, response, "TT_CART",JsonUtils.objectToJson(itemList) ,true);
		return TaotaoResult.ok();
	}

	
	/****
	 * 展示购物车
	 * 从cookie中获取
	 */
	@Override
	public List<CartItem> getCartItemList(HttpServletRequest request, HttpServletResponse response) {
		List<CartItem> itemList = getCartItemList(request);
		return itemList;
	}
	
	
	/**
	 * 删除购物车商品
	 * <p>Title: deleteCartItem</p>
	 * <p>Description: </p>
	 * @param itemId
	 * @return
	 * @see com.taotao.portal.service.CartService#deleteCartItem(long)
	 */
	@Override
	public TaotaoResult deleteCartItem(long itemId, HttpServletRequest request, HttpServletResponse response) {
		//从cookie中取购物车商品列表
		List<CartItem> itemList = getCartItemList(request);
		//从列表中找到此商品
		for(CartItem cartItem : itemList){
			if(cartItem.getId() == itemId){
				itemList.remove(cartItem);
				break;
			}
		}
		//把购物车列表重新写入cookie
		CookieUtils.setCookie(request, response, "TT_CART", JsonUtils.objectToJson(itemList), true);
		return TaotaoResult.ok();
	}
	
	/**
	 * 从cookie中取商品列表
	 * <p>Title: getCartItemList</p>
	 * <p>Description: </p>
	 * @return<br/>
	 * 一个方法不要写太多内容,把复杂的业务逻辑拆分成多个方法,便于维护
	 */
	private List<CartItem> getCartItemList(HttpServletRequest request) {
		//从cookie中取商品列表  (第三个参数是是否编码,设为true默认为utf-8)
		String cartJson  = CookieUtils.getCookieValue(request, "TT_CART",true);
		if(null == cartJson ){
			//如果购物车是空的,返回空集合
			return new ArrayList<>();
		}
		try {
			//把json转换成商品列表
			List<CartItem> list = JsonUtils.jsonToList(cartJson ,CartItem.class);
			return list;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return new ArrayList<>();
	}

	
}
